今更ながらBigQueryのオブジェクトテーブルを触ってみた

今更ながらBigQueryのオブジェクトテーブルを触ってみた

Clock Icon2024.07.30

Google Cloudデータエンジニアのはんざわです。
先日、BigQueryのオブジェクトテーブルを利用する機会があり、その際に得た知見を本ブログにまとめたいと思います。

オブジェクトテーブルとは?

https://cloud.google.com/bigquery/docs/object-table-introduction

オブジェクトテーブルとは、BigQueryの外部テーブルの一種でCloud Storageにある非構造化データの読み取りが可能なテーブルです。
主なユースケースとして、BigQuery MLやCloud Vision、Document AIなどを使用した非構造化データの推論が挙げられます。

事前準備

https://cloud.google.com/bigquery/docs/object-tables

上記ドキュメントを参考にオブジェクトテーブルを作成します。

事前準備では、以下の4つを実施しております。

  1. Cloud Storageの作成
  2. オブジェクトテーブルが参照する非構造化データのアップロード
  3. BigQuery Connectionの作成
  4. BigQuery Connectionのサービスアカウントの権限設定

1. Cloud Storageの作成と非構造化データのアップロード

まずは、オブジェクトテーブルが参照するCloud Storageと非構造化データの準備をします。

コネクションと同じようにGoogle Cloud Shellで次のコマンドを実行し、Cloud Storageを作成します。

gcloud storage buckets create gs://object-tables-test \
    --location=asia-northeast1 \
    --uniform-bucket-level-access

さらに次のコマンドをローカルで実行し、テスト用の画像データをCloud Storageにアップロードします。

gcloud storage cp fruit_ringo.png gs://object-tables-test/png/
gcloud storage cp soccer_ball.png gs://object-tables-test/png/

2. BigQuery Connectionの準備

https://cloud.google.com/bigquery/docs/create-cloud-resource-connection

まずは、Cloud Storageに接続するために BigQuery Connection を作成します。
ここで作成するクラウドリソース接続は、BigLakeテーブルやリモート関数で使用されるものと同じです。

Google Cloud Shellで以下のコマンドを実行し、BigQuery Connectionを作成します。
コネクション名を object-tables-connection とし、ロケーションはCloud Storageと同じ asia-northeast1(東京リージョン) にしました。

bq mk --connection \
    --location=asia-northeast1 \
    --connection_type=CLOUD_RESOURCE \
    object-tables-connection

さらに作成したBigQuery ConnectionのサービスアカウントがCloud Storageのオブジェクトを参照できるように権限を割り当てます。
今回の例だと、bqcx-868908576898-oc3s@gcp-sa-bigquery-condel.iam.gserviceaccount.com のサービスアカウントにバケット単位で objectViewer の権限を割り当てます。

スクリーンショット 2024-07-30 16.40.59

Google Cloud Shellで次のコマンドを実行し、前述したサービスアカウントがgs://object-tables-testのオブジェクトを参照する権限を割り当てます。

gsutil iam ch serviceAccount:bqcx-868908576898-oc3s@gcp-sa-bigquery-condel.iam.gserviceaccount.com:objectViewer gs://object-tables-test

オブジェクトテーブルを試してみる

事前準備が終わったので早速、オブジェクトテーブルを作成します。
オブジェクトテーブルの作成は、BigQueryから以下のSQLを発行して作成します。

CREATE EXTERNAL TABLE object_tables.test1
WITH CONNECTION `asia-northeast1.object-tables-connection`
OPTIONS(
  object_metadata = 'SIMPLE',
  uris = ['gs://object-tables-test/png/*']
);

作成されたテーブルを確認すると次のようなスキーマ構成になっていました。

スクリーンショット 2024-07-30 18.21.37

各フィールドの詳細は以下のドキュメントの通りです。

https://cloud.google.com/bigquery/docs/object-table-introduction#object_table_schema

続いて、以下のクエリでテーブルの中身を確認してみます。

SELECT
  *
FROM
  object_tables.test1

ドキュメントに記載通りの情報を取得することができました。

スクリーンショット 2024-07-30 18.26.38

おまけ

オブジェクトテーブルには、ファイルのコンテンツをRAWバイトで表す data という擬似列が存在します。
次の例のようにBase64でエンコードされた文字列を取得することが可能です。

SELECT
  data,
  uri
FROM
  object_tables.test2

スクリーンショット 2024-07-30 19.03.18

デコードすることでファイルの中身を確認することも可能です。

SELECT
  CAST(data AS STRING),
  uri
FROM
  object_tables.test2

スクリーンショット 2024-07-30 19.10.20

そのままJson型にパーズすることも可能です。

SELECT
  PARSE_JSON(CAST(data AS STRING)) AS json_data,
  uri
FROM
  object_tables.test2

スクリーンショット 2024-07-30 19.13.24

一応、ドキュメントには以下のような記載がありますので利用する際は注意してください。

また、オブジェクト テーブルには、ファイル コンテンツを RAW バイトで表す data 疑似列も含まれます。これは、オブジェクト テーブルの作成時に自動的に入力されます。この疑似列は、画像データの推論時に ML.DECODE_IMAGE 関数で使用されます。data 疑似列はクエリに含めることはできず、オブジェクト テーブル スキーマの一部としては表示されません。

https://cloud.google.com/bigquery/docs/object-table-introduction?hl=ja#object_table_schema

まとめ

今回のブログでは、BigQueryのオブジェクトテーブルを紹介しました。
BigQueryで画像や音声の機械学習タスクを扱う場合は有用な機能だと思います。
そのような機会があった方は、是非利用を検討してみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.